package ListasDoblesCirculares;

public class ListasDoblesCirculares {
	
	private NodeDobleCircular inicio;

	
	public ListasDoblesCirculares(){
		
		inicio = null;

	}
	
	public NodeDobleCircular getInicio(){
		
		return inicio;
	}
	

	public void setInicio(NodeDobleCircular valor){
		
		inicio = valor; 
		
	}
	
	
	public boolean listaVacia(){
		
		return (inicio == null);  
	}
	
	public void agregarInicio (String valor) {
		
		NodeDobleCircular nodeNew = new NodeDobleCircular(valor, null, null);
		
		if( listaVacia()){
			
			setInicio(nodeNew);
			inicio.setBack(inicio); 
			inicio.setNext(inicio); 
     
			
		} else{
			
			
			nodeNew.setNext(inicio);
			nodeNew.setBack(inicio.getBack()); 
			nodeNew.getBack().setNext(nodeNew); 
			inicio.setBack(nodeNew);
			setInicio(nodeNew);
			
			
		}
		

		
	}
	
	public void agregarFinal(String valor){
		
		NodeDobleCircular NodePtr = new NodeDobleCircular (valor, null, null);
		
		if(listaVacia()) agregarInicio(valor);
		else
		{
            inicio.getBack().setNext(NodePtr);
            NodePtr.setBack(inicio.getBack());
            NodePtr.setNext(inicio);
            inicio.setBack(NodePtr);
            
		}
		
	}
	
	public String borrarInicio(){
		
        String valor= "";


        if (listaVacia()) valor = "LA LISTA ESTA VACIA" ; 
        
        else{
        	
        	valor = inicio.getData();
        	
        	if (size() == 1){
        		
        		
        		inicio = null;
        		
        		
        	} else{
    

        		inicio.getBack().setNext(inicio.getNext());
        		inicio.getNext().setBack(inicio.getBack());
        		inicio = inicio.getNext();
        
        	}

        	}
        
        return valor;
	}
	
	public String borrarFinal(){
		
		String valor = "";
		
		if(listaVacia()) valor ="LISTA VACIA";
		
		else
			if(size()==1){
				borrarInicio(); 
			}
			else{
				
				valor = inicio.getBack().getData();
				inicio.getBack().getBack().setNext(inicio);
				inicio.setBack(inicio.getBack().getBack());

				
			}
		return valor;
	}
	
	public int size(){
		
		int total = 0;
		
		if (! listaVacia())  {
		
		NodeDobleCircular  NodePtr;
		NodePtr = inicio;
	
		
		do{
			total ++;
			NodePtr = NodePtr.getNext();
			
			} while(NodePtr != inicio);
		
		} 
		return total;
	}
	
	
	public String toString(){
		
		NodeDobleCircular NodePtr;
		String Lista;
		
		NodePtr = inicio;
		Lista = "";
	
		if (! listaVacia()){
		
		do {
			
			Lista += NodePtr.getData() + "->";
			NodePtr = NodePtr.getNext();
			
		} while  (NodePtr != inicio) ;
	  
		
		}
	  Lista += "NULL";
	  return Lista;
	  	
	}
	
	public String toStringInverso(){
		
		NodeDobleCircular NodePtr;
		String Lista;
		
		
		Lista = "";
	
		if (! listaVacia()){
		
			NodePtr = inicio.getBack();
			
		while  (NodePtr != inicio) {
			
			Lista += NodePtr.getData() + "->";
			NodePtr = NodePtr.getBack();
			
		} 
	  
		Lista += inicio.getData() + "->";
		
		}
	  Lista += "NULL";
	  return Lista;
	  	
	}
	
	
}